
#ifndef ARCHIVODEBLOQUES_H_
#define ARCHIVODEBLOQUES_H_

#include "BlockedFile.h"
#include "Bloque.h"
#include "ListaEnlazada.h"

#define ARCH_BLOQUES_EXT "dat"

class ArchivoDeBloques {
private:
	string nombre;
	BlockedFile archivo;
	ListaEnlazada* administrador;
	// para lectura secuencial de registros
	int nroBloqueActual;
	Bloque* bloqueActual;

public:
	/**
	 * Constructor por default
	 * path:ruta del archivo
	 * sizeBloque: tamaño del bloque
	 */
	ArchivoDeBloques(string nombre, int sizeBloque);
	~ArchivoDeBloques();

	/**
	 * Agrega bloque al final del archivo y retorna la posicion del mismo.
	 */
	int agregarBloque(Bloque* bloque);

	/**
	 *Agrega bloque en la posicion indicada.
	 */
	void agregarBloque(int posicion, Bloque* bloqueNuevo);

	/**
	 * Modifica el bloque en la posicion indicada
	 */
	void modificarBloque(int posicion, Bloque* bloqueModif);

	/**
	 * Retorna el path del archivo
	 */
	string getPath();

	/**
	 * Retorna cantidad de bloques
	 */
	int getCantidadBloques();

	/**
	 * Retorna la cantidad de registros de todos los bloques sumados
	 */
	int getCantidadRegistros();

	/*
	 * Se fija si quedan registros sin leer en el archivo
	 */
	bool quedanRegistros();

	/*
	 * Copia el registro leído secuencialmente en 'sig' y aumenta el puntero de lectura.
	 * Retorna true si pudo leer el registro.
	 */
	bool siguienteRegistro(Registro* sig);

	/*
	 * Resetea el puntero de lectura y se posiciona en el primer bloque del archivo
	 */
	void resetLectura();

	/**
	 * Obtiene el bloque de la posicion indicada reservando lugar en memoria
	 */
	Bloque* obtenerBloque(int posicion);

	/**
	 * Setea el bloque de la posicion libre
	 */
	void setBloqueLibre(int posicion);

	/**
	 * Retorna la posicion de un bloque libre.
	 * En caso de no haber libres retorna -1
	 */
	int getBloqueLibre();

	/**
	 * Limpia todo el archivo
	 */
	void limpiar();

private:

	/*
	 * Lee el siguiente bloqueActual
	 */
	void siguienteBloque();
};

#endif /* ARCHIVODEBLOQUES_H_ */
